/*
Copyright (C) 2009  Raymond Jeon
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


#include "gl_lib_include.h"
#include "gl_mail_define.h"
#include "gl_mail_log.h"
#include "gl_mail_gdata.h"
#include "gl_smtp_session.h"
#include "gl_smtp_command.h"
#include "gl_mail_statistics.h"





////////////////////////////////////////////////////////////////////////////////
//	Date : 2003-2-20
//	Update : 
//	Author : Raymond Jeon
//	Parameters
//	Return Value  
//	Remarks 
////////////////////////////////////////////////////////////////////////////////

BOOL GlSmtpThreadMain(glqueue_ *qData)
{
	glsmtpsession_	smtp_;
	glsmtpsession_	*gsn = &(smtp_);
	SOCKRET			sockRet;

	GlLogSmtp(1, "SMTP Session Start (%s)", qData->q_szIp);	

	GlStatEventAdd(STAT_RECVCONN, 1);

	if (GlSmtpSessionInit(gsn, qData) == FALSE)
	{
		GlSmtpSessionFree(gsn);
		return FALSE;
	}

	if (GlLinkListFindWildCardTild(glData.listenSmtp.llRejectIP, qData->q_szIp) &&
		!GlLinkListFindWildCardTild(glData.listenSmtp.llAllowIP, qData->q_szIp))
	{
		GlStatEventAdd(STAT_REJECTSMTP, 1);
		GlSocketStreamPrintfLnLog(gsn->stream, GlLogSmtp, "221 Reject IP (%s)",	qData->q_szIp);
		GlSmtpSessionFree(gsn);
		return TRUE;
	}

	GlSocketStreamPrintfLnLog(gsn->stream, GlLogSmtp, "220 %s ESMTP server (%s) is ready %s", __SZ(glData.szServerName), glData.szServerVersion, gsn->szDate);

	while (gsn->stream->bClose == FALSE)
	{
		sockRet = GlSocketStreamReadLineLog(gsn->stream, GlLogSmtp);
		if (sockRet <= 0)
		{
			GlLogSmtp(1, "Socket error");
			break;
		}
		GlSmtpCommandFuncCall(gsn);
	}

	GlSmtpSessionFree(gsn);

	return TRUE;
}



